科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件插件系统[8]·系统组装策略分析

插件系统[8]·系统组装策略分析

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

组装包括两个部分,界面的装配、插件交互关系的装配。

作者:陈亮亮 来源:CSDN 2008年1月19日

关键字: 策略 组装 插件 Windows

  • 评论
  • 分享微博
  • 分享邮件

之前写过不少关于插件系统的文章,有介绍框架的,也有介绍插件结构的。今天主要是分析一下插件系统的组装过程。

组装包括两个部分,界面的装配、插件交互关系的装配。下面会介绍三种组装策略,并简单分析一下不同组装策略的差异。

一、插件系统的生命期

插件是独立的模块,每个模块向用户提供一部分功能,只有将几个模块组合起来才能真正给用户带来价值。

插件系统分为装载期和运行期两个阶段。
装载期时,装载程序将不同的插件按照配置文件组装起来,主要包括界面布局和插件接口之间的调用关系。
装载完成后的插件系统处于运行期。运行期时需要从两个角度来分析:插件内部行为,包括内部的函数调用以及用户输入的响应;插件之间的交互。

在装载期需要装载器将系统必要的插件按照需求组装成可运行的系统。下面介绍三种组装过程,会采用“积木”的隐喻来解释工作原理。

二、三种组装策略

2.1 Eclipse的最小化组装

说起插件不能不说到Eclipse了,它是一个非常成功的插件系统,属于微内核。这里的内核也可以说是装载器了。

首先说两个概念,“插件”和“插件模板”。插件是在系统运行期时的功能模块,从程序员的角度来看,是一些实例对象。插件模板指的是配置文件,有插件本身的配置信息,比如说图标、标题等,另外还有插件之间的关联关系(扩展和扩展点的概念)。可以通过指定的插件模板生成插件。

这里认为Eclipse是最小化的组装是因为在Eclipse中装载过程是分散到系统中的各个角落。由父插件装载并创建子插件,装载并创建就是组装过程。整个Eclipse在装载期只会将配置文件读入内存,生成插件模板体系,随后创建第一个插件(主插件)。至于其他的插件都是主插件的子插件,或者孙子、重孙子辈的插件。装载器的功能非常简单,原因在于它将组装过程分散到系统中的各级父插件的身上。

用积木的隐喻来解释Eclipse的插件组装过程就是,由装载器将第一个积木搭好,然后把设计图纸放到大家都看得到的白板上面。如果有人想看某个积木之上的东西,那么这个积木中自带的一个小的装载机器会将积木之上的其他积木马上放上来。

可以看到,Eclipse中的积木是非常智能的。因为它们本身就会搭积木。这样系统的装载器,要做的事情就非常少了。

2.2 装载时绑定

装载时需要确定插件的界面呈现,插件之间的交互。如果设计的好的话,插件的外观布局是可以和插件的交互分开处理的。

插件的外观布局由配置文件指定,在装载期,通过读取系统的配置文件可以确定某一插件放在什么地方。在装载期将所有的插件界面全部放置到系统中,这样系统的运行期在界面上和普通的系统没有什么区别——如果需要懒加载,可以用代理对象来实现,对装载期没有影响。

插件之间的交互同样通过配置文件指定。这时候需要用到接口才可隔离不同的插件实现。接口是积木的外观。装载器可以将所有的插件之间的接口绑定起来,可以使用观察者模式来处理。在系统装载的过程中,通过外部的指定,将所有观察者的接口注册到各个目标中,这样目标和观察者之间就可以相互通信了。

这个插件系统就是一个图状的结构,插件自身会存储它和其他插件的关系。装载器的一个重要职责就是将这些关系建立起来,并且维护每个插件内部的观察者列表。

用这种方式组装系统的话,在系统的装载期由装载器就已经将整个积木模型搭建好了。每个积木完成自己分内的事,处理好和自己吻合起来的积木之间的关系就可以。

2.3 运行时绑定

界面绑定和上面说的没有什么区别,但将插件之间的关系,也就是每个插件内部存储的观察者列表去掉了。这样保证插件本身是最清洁的。

插件与其观察者之间的匹配关系抽象成关系模式,这种对应关系在全局的关系列表中存着。

和第二种对比起来看,界面部分装载没有区别,但第二种组装是将插件交互关系在装载时绑定到插件内部,而这种是将插件关系存成一张列表,每个插件在需要调用的地方动态获得观察者的列表。实现采用的是以前介绍过的关系模式。

装载器也是比较简单的,界面部分不再讨论,交互关系仅仅将配置文件中和交互相关的配置读入内存就可以。

三、对比分析

3.1 隐喻场景

装载就是将现有的积木按照图纸搭成模型的过程。

Eclipse的装载器最会偷懒,他说,我帮你把第一个积木放在那边了,至于其他的积木在用的时候让积木自己装去吧。还好这些积木都是比较智能的,如果积木比较弱智,不懂得装载其他的积木,那么它就只能放在最顶层,上面就不能放东西了。装载器可不会管这些。

装载时绑定的方式,装载器就比较尽心尽力了,他会将所有的插件按照图纸搭好,包括积木的位置、外观等,积木之间相互吻合的地方也是连接的一丝不苟。装载完成后就是一个完整的系统了。当然,这时候的积木就不需要那么智能,也不用管其他的积木怎么摆放,只要把自己交给装载器就行。

运行时绑定的方式中,装载器既不像Eclipse中的那么懒,也没有第二种那么勤快。它将积木的位置放好,外观调好,但是积木之间的衔接处并没有连起来。将每个积木和其他积木的吻合情况生成另外一张连接图,在运行期,由积木自己根据这张图找到吻合的积木。

3.2 延时加载

三种组装策略中都可以实现延时加载的方式。这里将延时加载单独拿出来说是因为这个在插件系统中太重要了。

Eclipse中的延时加载是天生的。装载的策略决定了插件本身就是延时加载的。但后两种却没有这个能力,不过我们能够使用代理插件来实现同样的效果。基本的思路就是,按照配置文件生成插件的代理对象,装载期将所有的代理对象装配起来,在运行期由代理的特性自动装载真实的插件。对于装载器和运行期来说,延时加载是透明的。

3.3 职责分配

第一种的装载过程没有和运行期明确分开,并且插件也会负责装载,所以说这里的职责分配是不明确的,但带来的一个好处就是微内核。其他两种的装载和运行期分的比较清楚,但内核比较大。

3.4 插件交互

在Eclipse中插件的组织是一个树形结构,插件之间的交互非常严格。当然,从系统耦合度的方面来看,这样严格的限制是有好处的,但这种树状的组织结构并不能满足所有的要求,尤其在行业软件中。系统中的插件数量多,交互非常复杂,是一种图状的结构的话,第一种模式就不适合了。第二种和第三种都能满足图状交互的特点,交互的能力强。

如果采用后两种方式来搭建插件系统的话,一定要注意控制系统中的耦合度。

3.5 装载期效率

Eclipse的装载最简单,效率是最高的。第二种装载最复杂,效率也是最低的。第三种介于两者之间。

3.6 运行期效率

Eclipse运行时需要即时装配插件,运行的效率较低。第二种所有系统运行需要的因素都在装载期处理好,系统运行时都是静态调用,性能最好。第三种介于两者之间。

如果插件之间频繁交互的话,第一种和第二种都是会在插件内部存储一个关联的接口列表,所以性能上不会有问题。而第三种需要动态去取关联的插件,这里需要注意。采用普通的List来存储关系性能上不符合要求,可以考虑使用Hash表来优化性能。

四、后记

关于插件系统写了八篇文章,虽然有很多细节上没有写出来,但插件系列也算是告一段落了。一方面出于对公司知识产权的保密,现在怎么说都是在给公司做事,讲得再细一些就要把代码放上来了。另外今后我会多放一些精力在我的“读易”系列上面,对于“读易”这一块大家褒贬不一吧,不过我个人觉得还是很有研究价值的。

今后还会零星地写一些纯技术的文章,也希望大家继续关注.Net版块。 


查看本文来源
    • 评论
    • 分享微博
    • 分享邮件
    闂傚倸鍊搁崐鎼佸磹妞嬪孩顐介柨鐔哄Т閻骞栧ǎ顒€濡肩紒鎰殜閺岋繝宕堕埡浣锋睏闂佸搫顑呴柊锝夊蓟閺囷紕鐤€閻庯綆浜炴禒鐐節濞堝灝鐏犻柕鍫熸倐瀵寮撮敍鍕澑闁诲函缍嗘禍鏍磻閹捐鍐€妞ゆ挶鍔庣粙蹇涙⒑鐠恒劌娅愰柟鍑ゆ嫹

    婵犵數濮烽弫鍛婃叏閻戝鈧倹绂掔€n亞鍔﹀銈嗗坊閸嬫捇鏌涢悢閿嬪仴闁糕斁鍋撳銈嗗坊閸嬫挾绱撳鍜冭含妤犵偛鍟灒閻犲洩灏欑粣鐐烘⒑瑜版帒浜伴柛鎾寸洴閹儳煤椤忓應鎷洪梻鍌氱墛閸楁洟宕奸妷銉ф煣濠电姴锕ょ€氼參宕h箛鏃傜瘈濠电姴鍊绘晶娑㈡煕鐎c劌濡介柕鍥у瀵粙濡歌閳ь剚甯¢弻鐔兼寠婢跺﹥娈婚梺鍝勭灱閸犳牠骞冨⿰鍫濈厸闁稿本绋撹ぐ瀣煟鎼淬値娼愭繛鍙壝悾婵堢矙鐠恒劍娈鹃梺鍓插亝濞叉牠鎮″☉銏$厱閻忕偛澧介惌瀣箾閸喐鍊愭慨濠勭帛閹峰懐绮电€n亝鐣伴梻浣规偠閸斿宕¢崘鑼殾闁靛繈鍊曢崘鈧銈嗗姂閸庡崬鐨梻鍌欑劍鐎笛呯矙閹寸姭鍋撳鐓庡籍鐎规洑鍗冲畷鍗炍熼梹鎰泿闂備線娼ч悧鍡涘箠鎼淬垺鍙忔い鎺嗗亾闁宠鍨块崺銉╁幢濡炲墽鍑规繝鐢靛О閸ㄦ椽鏁嬮柧鑽ゅ仦娣囧﹪濡堕崨顔兼闂佺ǹ顑呴崐鍦崲濞戙垹骞㈡俊顖濐嚙绾板秹鏌f惔銏e妞わ妇鏁诲璇差吋閸偅顎囬梻浣告啞閹搁箖宕版惔顭戞晪闁挎繂顦介弫鍡椼€掑顒婂姛闁活厽顨嗙换娑㈠箻閺夋垹鍔伴梺绋款儐閹瑰洭寮婚敐鍛婵炲棙鍔曠壕鎶芥⒑閸濆嫭婀扮紒瀣灴閸╃偤骞嬮敃鈧婵囥亜閺囩偞鍣洪柍璇诧功缁辨捇宕掑▎鎴濆濡炪們鍔岄幊姗€骞嗗畝鍕<闁绘劙娼х粊锕傛煙閸忚偐鏆橀柛鏂跨焸閹偤宕归鐘辩盎闂佸湱鍎ら崹鐢割敂閳哄懏鍊垫慨姗嗗墻濡插綊鏌曢崶褍顏€殿喕绮欐俊姝岊槼闁革絻鍎崇槐鎾存媴缁涘娈┑鈽嗗亝缁诲牆顕f繝姘亜缁炬媽椴搁弲锝夋偡濠婂啰效闁诡喗锕㈤幊鐘活敆閸屾粣绱查梺鍝勵槸閻楀嫰宕濇惔锝囦笉闁绘劗鍎ら悡娑㈡倶閻愯泛袚闁哥姵锕㈤弻鈩冩媴閻熸澘顫掗悗瑙勬礈閸犳牠銆佸鈧幃鈺呮惞椤愩倝鎷婚梻鍌氬€峰ù鍥х暦閸偅鍙忛柟鎯板Г閳锋梻鈧箍鍎遍ˇ顖炲垂閸岀偞鐓㈡俊顖滃皑缁辨岸鏌ㄥ┑鍡╂Ц缂佲偓鐎n偁浜滈柡宥冨妿閳藉绻涢崼鐔虹煉婵﹨娅e☉鐢稿川椤斾勘鈧劕顪冮妶搴′簼婵炶尙鍠栧畷娲焵椤掍降浜滈柟鍝勬娴滈箖姊洪幐搴㈢┛濠碘€虫搐鍗遍柟鐗堟緲缁秹鏌涢锝囩畼妞ゆ挻妞藉铏圭磼濡搫顫岄悗娈垮櫘閸撴瑨鐏冮梺鍛婁緱閸犳岸宕㈤幖浣光拺闁告挻褰冩禍浠嬫煕鐎n亜顏柟顔斤耿閺佸啴宕掑☉姘箞闂佽鍑界紞鍡涘磻閸℃ɑ娅犳い鎺戝€荤壕濂告煕鐏炲墽鈽夌紒妞﹀洦鐓欓柣鐔告緲椤忣參鏌熼悡搴㈣础闁瑰弶鎸冲畷鐔兼濞戞瑦鐝¢梻鍌氬€搁崐椋庣矆娓氣偓楠炴牠顢曢妶鍌氫壕婵ê宕崢瀵糕偓瑙勬礀缂嶅﹪寮婚崱妤婂悑闁告侗鍨界槐閬嶆煟鎼达紕鐣柛搴ㄤ憾钘濆ù鍏兼綑绾捐法鈧箍鍎遍ˇ浼存偂閺囥垺鐓涢柛銉e劚婵$厧顭胯閸ㄤ即婀侀梺缁樓圭粔顕€顢旈崼鐔虹暢闂傚倷鐒︾€笛呮崲閸屾娑樜旈崨顓犲幒闂佸搫娲㈤崹娲偂閸愵亝鍠愭繝濠傜墕缁€鍫熸叏濡寧纭鹃柦鍐枛閺屾洘绻涜鐎氱兘宕戦妸鈺傗拺缂備焦锚婵洦銇勯弴銊ュ籍闁糕斂鍨藉鎾閳ユ枼鍋撻悽鍛婄叆婵犻潧妫楅埀顒傛嚀閳诲秹宕堕妸锝勭盎闂婎偄娲︾粙鎰板箟妤e啯鐓涢悘鐐靛亾缁€瀣偓瑙勬礋娴滃爼銆佸鈧幃銏$附婢跺澶�

    重磅专题
    往期文章
    最新文章